package org.mte.sak.sort.comparator.impl;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

import org.mte.sak.sort.comparator.AbstractComparator;

/**
 * <i>Comparatore Data</i>.
 *
 * @author Marco Traversari
 * @version $Revision: 1.2 $ $Date: 2011-12-27 11:42:34 $
 *
 */
public class DateComparator extends AbstractComparator {

	/**
	 * DateComparator
	 */
	public DateComparator() {
	}

	/**
	 * DateComparator
	 * @param isAscending
	 */
	public DateComparator(boolean isAscending) {
		this.isAscending = isAscending;
	}

	/**
	 * Restituisce il valore formattato secondo
	 * il riferimento indicato.
	 *
 	 * @param value
	 * @param formatReference
	 * @return il valore dell'oggetto.
	 */
	public Object getValue(String value, Object formatReference) {
		return getValue(value, formatReference, Locale.ITALY);
	}
	
	/**
	 * getValue
	 * @param value
	 * @param formatReference
	 * @param locale
	 * @return value
	 */
	public Object getValue(String value, Object formatReference, Locale locale) {
		String pattern = (String) formatReference;
		SimpleDateFormat sdf = new SimpleDateFormat(pattern, locale);
		Date date = null;
		try {
			if (value == null || value.equals("")) {
				date = getMinDate();
			} else {
				date = sdf.parse(value);
			}
		} catch (ParseException pe) {
			pe.printStackTrace();
		}
		return date;
	}

  	/**
  	 * Confronta i valori dei due elementi specificati e restituisce
  	 * un tipo <code>boolean</code> in funzione dell'esito
  	 * della comparazione e del tipo di ordinamento impostato.
  	 *
  	 * @param obj1
  	 * @param obj2
  	 * @return true, false.
  	 */
	public boolean compare(Object obj1, Object obj2) {
		boolean result = isAscending;
		Date date1 = (Date) obj1;
		Date date2 = (Date) obj2;
		if (date2.before(date1)) {
			result = !isAscending;
		}
		return result;
	}

 	/**
	 * Confronta i due elementi specificati e restituisce
  	 * un tipo <code>int</code> in funzione dell'esito
  	 * della comparazione.
  	 *
     * @param obj1
     * @param obj2
     *
     * @return "0" se obj2 = obj1; "<0" se obj1 < obj2; ">0" obj1 > obj2.
     */
	public int compareOneToOne(Object obj1, Object obj2) {
		Date date1 = (Date) obj1;
		Date date2 = (Date) obj2;
		Long long1 = new Long(date1.getTime());
		Long long2 = new Long(date2.getTime());
		return long1.compareTo(long2);
    }

	/**
	 * Restituisce la data minima.
	 * @return la data minima.
	 */
	private Date getMinDate() {
		Calendar calendar = Calendar.getInstance();
		calendar.set(1970, 1, 1, 0, 0);
		return calendar.getTime();
	}
}